library(rvest)
library(tidyverse)
library(magrittr)
library(ncaahoopR)
library(sqldf)

proj = "C:/Users/Orion Wilcox/Documents/Personal/Projects/NCAA Schedules"

#Pull data

#helper data from ncaahoopsR
dict = dict
teams = ids

#rankings from NCAA website (updated daily)
ncaa = read_html("https://www.ncaa.com/rankings/basketball-men/d1/ncaa-mens-basketball-net-rankings")

net_rank = ncaa %>%
  html_element("table") %>%
  html_table() %>%
  select(Rank, School) %>%
  janitor::clean_names()

#grab vector of top 25 teams based on net ranking
top_25 = filter(net_rank, rank <=25)

top_25 = left_join(top_25, dict, by = c("school" = "NCAA")) %>%
  select(rank, school = ESPN)

top_25_list = top_25$school

#grab vector of bubble teams

bubble = filter(net_rank, rank >= 63 & rank <= 72)

bubble$school = recode(bubble$school, 
                     "Ohio St." = "Ohio State",
                     "St. Bonaventure" = "St Bonaventure")

bubble_list = bubble$school

pull schedules for top 25 teams


df = data.frame()

for (i in bubble_list) {
  sched = get_schedule(i)
  sched$team = i
  df = bind_rows(df, sched)
  
}


net_rank_dict = left_join(net_rank, dict, by = c("school" = "NCAA"))

df_rank = sqldf("SELECT * FROM df 
       LEFT JOIN net_rank_dict
       ON df.opponent = net_rank_dict.school
       OR df.opponent = net_rank_dict.ESPN
       OR df.opponent = net_rank_dict.ESPN_PBP
       OR df.opponent = net_rank_dict.Warren_Nolan")

#manually review for missing D1 schools

df$opponent = recode(df$opponent, 
                     "Fairleigh Dickinson" = "FDU",
                     "Miami OH" = "Miami (OH)",
                     "Tarleton State" = "Tarleton St.")

df_rank = sqldf("SELECT * FROM df 
       LEFT JOIN net_rank_dict
       ON df.opponent = net_rank_dict.school
       OR df.opponent = net_rank_dict.ESPN
       OR df.opponent = net_rank_dict.ESPN_PBP
       OR df.opponent = net_rank_dict.Warren_Nolan") %>%
  select(1:10) 
df_rank %<>%
  mutate(result = ifelse(team_score > opp_score, "Win", "Loss"),
         quad = case_when(location == "H" & rank <= 30 ~ "Quad 1",
                          location == "N" & rank <= 50 ~ "Quad 1",
                          location == "A" & rank <= 75 ~ "Quad 1",
                          location == "H" & rank <= 75 ~ "Quad 2",
                          location == "N" & (rank >= 50 & rank <=100) ~ "Quad 2",
                          location == "A" & (rank >= 75 & rank <=135) ~ "Quad 2",
                          location == "H" & (rank >= 75 & rank <= 160) ~ "Quad 3",
                          location == "N" & (rank >= 101 & rank <= 200) ~ "Quad 3",
                          location == "A" & (rank >= 135 & rank <= 240) ~ "Quad 3",
                          TRUE ~ "Quad 4"))

df_rank %<>%
  select(team, date, opponent, team_score, opp_score, result, quad, rank, location, team_score, opp_score) %>%
  group_by(team) %>%
  mutate(game_order = dense_rank(date))

#chart

each team’s worst loss

#export

ggsave(paste0(proj, "/visuals/top_25.png"), width = 1200, height = 1500, unit = "px")

#datawrapper export

write_csv(top_25_sched, paste0(proj, "/data/top_25.csv"))
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQoNCmBgYHtyfQ0KbGlicmFyeShydmVzdCkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShtYWdyaXR0cikNCmxpYnJhcnkobmNhYWhvb3BSKQ0KbGlicmFyeShzcWxkZikNCg0KcHJvaiA9ICJDOi9Vc2Vycy9PcmlvbiBXaWxjb3gvRG9jdW1lbnRzL1BlcnNvbmFsL1Byb2plY3RzL05DQUEgU2NoZWR1bGVzIg0KYGBgDQoNCiNQdWxsIGRhdGENCg0KYGBge3J9DQojaGVscGVyIGRhdGEgZnJvbSBuY2FhaG9vcHNSDQpkaWN0ID0gZGljdA0KdGVhbXMgPSBpZHMNCg0KI3JhbmtpbmdzIGZyb20gTkNBQSB3ZWJzaXRlICh1cGRhdGVkIGRhaWx5KQ0KbmNhYSA9IHJlYWRfaHRtbCgiaHR0cHM6Ly93d3cubmNhYS5jb20vcmFua2luZ3MvYmFza2V0YmFsbC1tZW4vZDEvbmNhYS1tZW5zLWJhc2tldGJhbGwtbmV0LXJhbmtpbmdzIikNCg0KbmV0X3JhbmsgPSBuY2FhICU+JQ0KICBodG1sX2VsZW1lbnQoInRhYmxlIikgJT4lDQogIGh0bWxfdGFibGUoKSAlPiUNCiAgc2VsZWN0KFJhbmssIFNjaG9vbCkgJT4lDQogIGphbml0b3I6OmNsZWFuX25hbWVzKCkNCg0KI2dyYWIgdmVjdG9yIG9mIHRvcCAyNSB0ZWFtcyBiYXNlZCBvbiBuZXQgcmFua2luZw0KdG9wXzI1ID0gZmlsdGVyKG5ldF9yYW5rLCByYW5rIDw9MjUpDQoNCnRvcF8yNSA9IGxlZnRfam9pbih0b3BfMjUsIGRpY3QsIGJ5ID0gYygic2Nob29sIiA9ICJOQ0FBIikpICU+JQ0KICBzZWxlY3QocmFuaywgc2Nob29sID0gRVNQTikNCg0KdG9wXzI1X2xpc3QgPSB0b3BfMjUkc2Nob29sDQoNCiNncmFiIHZlY3RvciBvZiBidWJibGUgdGVhbXMNCg0KYnViYmxlID0gZmlsdGVyKG5ldF9yYW5rLCByYW5rID49IDYzICYgcmFuayA8PSA3MikNCg0KYnViYmxlJHNjaG9vbCA9IHJlY29kZShidWJibGUkc2Nob29sLCANCiAgICAgICAgICAgICAgICAgICAgICJPaGlvIFN0LiIgPSAiT2hpbyBTdGF0ZSIsDQogICAgICAgICAgICAgICAgICAgICAiU3QuIEJvbmF2ZW50dXJlIiA9ICJTdCBCb25hdmVudHVyZSIpDQoNCmJ1YmJsZV9saXN0ID0gYnViYmxlJHNjaG9vbA0KDQpgYGANCg0KcHVsbCBzY2hlZHVsZXMgZm9yIHRvcCAyNSB0ZWFtcw0KDQpgYGB7cn0NCg0KZGYgPSBkYXRhLmZyYW1lKCkNCg0KZm9yIChpIGluIGJ1YmJsZV9saXN0KSB7DQogIHNjaGVkID0gZ2V0X3NjaGVkdWxlKGkpDQogIHNjaGVkJHRlYW0gPSBpDQogIGRmID0gYmluZF9yb3dzKGRmLCBzY2hlZCkNCiAgDQp9DQoNCg0KbmV0X3JhbmtfZGljdCA9IGxlZnRfam9pbihuZXRfcmFuaywgZGljdCwgYnkgPSBjKCJzY2hvb2wiID0gIk5DQUEiKSkNCg0KZGZfcmFuayA9IHNxbGRmKCJTRUxFQ1QgKiBGUk9NIGRmIA0KICAgICAgIExFRlQgSk9JTiBuZXRfcmFua19kaWN0DQogICAgICAgT04gZGYub3Bwb25lbnQgPSBuZXRfcmFua19kaWN0LnNjaG9vbA0KICAgICAgIE9SIGRmLm9wcG9uZW50ID0gbmV0X3JhbmtfZGljdC5FU1BODQogICAgICAgT1IgZGYub3Bwb25lbnQgPSBuZXRfcmFua19kaWN0LkVTUE5fUEJQDQogICAgICAgT1IgZGYub3Bwb25lbnQgPSBuZXRfcmFua19kaWN0LldhcnJlbl9Ob2xhbiIpDQoNCiNtYW51YWxseSByZXZpZXcgZm9yIG1pc3NpbmcgRDEgc2Nob29scw0KDQpkZiRvcHBvbmVudCA9IHJlY29kZShkZiRvcHBvbmVudCwgDQogICAgICAgICAgICAgICAgICAgICAiRmFpcmxlaWdoIERpY2tpbnNvbiIgPSAiRkRVIiwNCiAgICAgICAgICAgICAgICAgICAgICJNaWFtaSBPSCIgPSAiTWlhbWkgKE9IKSIsDQogICAgICAgICAgICAgICAgICAgICAiVGFybGV0b24gU3RhdGUiID0gIlRhcmxldG9uIFN0LiIpDQoNCmRmX3JhbmsgPSBzcWxkZigiU0VMRUNUICogRlJPTSBkZiANCiAgICAgICBMRUZUIEpPSU4gbmV0X3JhbmtfZGljdA0KICAgICAgIE9OIGRmLm9wcG9uZW50ID0gbmV0X3JhbmtfZGljdC5zY2hvb2wNCiAgICAgICBPUiBkZi5vcHBvbmVudCA9IG5ldF9yYW5rX2RpY3QuRVNQTg0KICAgICAgIE9SIGRmLm9wcG9uZW50ID0gbmV0X3JhbmtfZGljdC5FU1BOX1BCUA0KICAgICAgIE9SIGRmLm9wcG9uZW50ID0gbmV0X3JhbmtfZGljdC5XYXJyZW5fTm9sYW4iKSAlPiUNCiAgc2VsZWN0KDE6MTApIA0KDQoNCg0KYGBgDQoNCmBgYHtyfQ0KZGZfcmFuayAlPD4lDQogIG11dGF0ZShyZXN1bHQgPSBpZmVsc2UodGVhbV9zY29yZSA+IG9wcF9zY29yZSwgIldpbiIsICJMb3NzIiksDQogICAgICAgICBxdWFkID0gY2FzZV93aGVuKGxvY2F0aW9uID09ICJIIiAmIHJhbmsgPD0gMzAgfiAiUXVhZCAxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gPT0gIk4iICYgcmFuayA8PSA1MCB+ICJRdWFkIDEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiA9PSAiQSIgJiByYW5rIDw9IDc1IH4gIlF1YWQgMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uID09ICJIIiAmIHJhbmsgPD0gNzUgfiAiUXVhZCAyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gPT0gIk4iICYgKHJhbmsgPj0gNTAgJiByYW5rIDw9MTAwKSB+ICJRdWFkIDIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiA9PSAiQSIgJiAocmFuayA+PSA3NSAmIHJhbmsgPD0xMzUpIH4gIlF1YWQgMiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uID09ICJIIiAmIChyYW5rID49IDc1ICYgcmFuayA8PSAxNjApIH4gIlF1YWQgMyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uID09ICJOIiAmIChyYW5rID49IDEwMSAmIHJhbmsgPD0gMjAwKSB+ICJRdWFkIDMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiA9PSAiQSIgJiAocmFuayA+PSAxMzUgJiByYW5rIDw9IDI0MCkgfiAiUXVhZCAzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICJRdWFkIDQiKSkNCg0KZGZfcmFuayAlPD4lDQogIHNlbGVjdCh0ZWFtLCBkYXRlLCBvcHBvbmVudCwgdGVhbV9zY29yZSwgb3BwX3Njb3JlLCByZXN1bHQsIHF1YWQsIHJhbmssIGxvY2F0aW9uLCB0ZWFtX3Njb3JlLCBvcHBfc2NvcmUpICU+JQ0KICBncm91cF9ieSh0ZWFtKSAlPiUNCiAgbXV0YXRlKGdhbWVfb3JkZXIgPSBkZW5zZV9yYW5rKGRhdGUpKQ0KYGBgDQoNCiNjaGFydA0KDQplYWNoIHRlYW0ncyB3b3JzdCBsb3NzDQoNCmBgYHtyfQ0KDQojcmVwbGFjZSBOQSB3aXRoIHVucmFua2VkDQpkZl9yYW5rICU8PiUNCiAgbXV0YXRlKHJhbmsgPSBpZmVsc2UoaXMubmEocmFuayksIDk5OSwgcmFuaykpDQoNCg0KZGZfbG9zc2VzID0gZGZfcmFuayAlPiUNCiAgZmlsdGVyKHJlc3VsdCA9PSAiTG9zcyIpICU+JQ0KICBncm91cF9ieSh0ZWFtKSAlPiUNCiAgbXV0YXRlKGxhYmVsID0gY2FzZV93aGVuKHJhbmsgPT0gbWF4KHJhbmspICYgcmVzdWx0ID09ICJMb3NzIiB+ICJXb3JzdCBsb3NzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiT3RoZXIgbG9zcyIpKQ0KDQpkZl93aW5zID0gZGZfcmFuayAlPiUNCiAgZmlsdGVyKHJlc3VsdCA9PSAiV2luIikgJT4lDQogIGdyb3VwX2J5KHRlYW0pICU+JQ0KICBtdXRhdGUobGFiZWwgPSBjYXNlX3doZW4ocmFuayA9PSBtaW4ocmFuaykgJiByZXN1bHQgPT0gIldpbiIgfiAiQmVzdCB3aW4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiT3RoZXIgd2luIikpDQoNCmRmX3RiZCA9IGRmX3JhbmsgJT4lDQogIGZpbHRlcihpcy5uYShyZXN1bHQpKSAlPiUNCiAgbXV0YXRlKGxhYmVsID0gIk5vdCB5ZXQgcGxheWVkIikNCg0KZGZfcmFuayA9IHJiaW5kKGRmX2xvc3NlcywgZGZfd2lucykNCmRmX3JhbmsgPSByYmluZChkZl9yYW5rLCBkZl90YmQpDQoNCiNzZXQgdGVhbSByYW5rIGFzIGZhY3Rvcg0KZGZfcmFuayR0ZWFtID0gZmFjdG9yKGRmX3JhbmskdGVhbSwgbGV2ZWxzID0gYnViYmxlX2xpc3QpDQoNCmRmX3JhbmsgJTw+JQ0KICBtdXRhdGUocXVhZF9yZXN1bHQgPSBpZmVsc2UoaXMubmEocmVzdWx0KSwgTkEsIHBhc3RlMChxdWFkLCAiICIsIHJlc3VsdCkpKSAlPiUNCiAgbXV0YXRlKGhlYXQgPSBjYXNlX3doZW4ocXVhZF9yZXN1bHQgPT0gIlF1YWQgMSBXaW4iIH4gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhZF9yZXN1bHQgPT0gIlF1YWQgMiBXaW4iIH4gMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhZF9yZXN1bHQgPT0gIlF1YWQgMyBXaW4iIH4gMywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhZF9yZXN1bHQgPT0gIlF1YWQgNCBXaW4iIH4gNCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhZF9yZXN1bHQgPT0gIlF1YWQgMSBMb3NzIiB+IDUsDQogICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWRfcmVzdWx0ID09ICJRdWFkIDIgTG9zcyIgfiA2LA0KICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFkX3Jlc3VsdCA9PSAiUXVhZCAzIExvc3MiIH4gNywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhZF9yZXN1bHQgPT0gIlF1YWQgNCBMb3NzIiB+IDgpKQ0KDQpkZl9yYW5rJHF1YWRfcmVzdWx0ID0gZmFjdG9yKGRmX3JhbmskcXVhZF9yZXN1bHQsIGxldmVscyA9IGMoIlF1YWQgMSBXaW4iLCAiUXVhZCAyIFdpbiIsICJRdWFkIDMgV2luIiwgIlF1YWQgNCBXaW4iLCAiUXVhZCAxIExvc3MiLCAiUXVhZCAyIExvc3MiLCAiUXVhZCAzIExvc3MiLCAiUXVhZCA0IExvc3MiKSkNCg0KZ2dwbG90KGRmX3JhbmspICsNCiAgZ2VvbV90aWxlKGFlcyh4PWdhbWVfb3JkZXIsIHk9dGVhbSwgZmlsbD1xdWFkX3Jlc3VsdCkpDQoNCmNvbG9ycyA9IGMoJyMwMDQ1ZmYnLCAnIzVlNzRmYycsICcjODRhMWY3JywgJyNhNmNkZjInLCAnI2ZmYzRiNScsICcjZmY5YjgwJywgJyNmZjZhNDknLCAnI2ZlMDAwMCcpDQoNCmRmX3JhbmsgJTw+JQ0KICBtdXRhdGUobG9jYXRpb24gPSBjYXNlX3doZW4obG9jYXRpb24gPT0gIkgiIH4gInZzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uID09ICJBIiB+ICJhdCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gPT0gIk4iIH4gInZzIChuZXV0cmFsIGNvdXJ0KSIpLA0KICAgICAgICAgdG9vbHRpcCA9IGlmZWxzZShpcy5uYShyZXN1bHQpLCAiTm90IHlldCBwbGF5ZWQiLCBwYXN0ZShxdWFkX3Jlc3VsdCwgbG9jYXRpb24sIG9wcG9uZW50LCB0ZWFtX3Njb3JlLCAidG8iLCBvcHBfc2NvcmUsIHNlcCA9ICIgIikpKQ0KDQpidWJibGUgPSBnZ3Bsb3QoZGZfcmFuaywgYWVzKHggPSBnYW1lX29yZGVyLCB5ID0gdGVhbSwgY29sb3IgPSBxdWFkX3Jlc3VsdCwgdGV4dCA9IHRvb2x0aXApLCBzaXplID0gMywgc2hhcGUgPSAxNSkgKw0KICBnZW9tX3BvaW50KCkgKw0KICBzY2FsZV95X2Rpc2NyZXRlKGxpbWl0cz1yZXYpICsNCiAgeGxhYigiR2FtZSIpICsNCiAgeWxhYigiIikgKw0KICBsYWJzKHRpdGxlID0gIlRvdXJuYW1lbnQgUmVzdW1lIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJCZXN0IFdpbnMgJiBXb3JzdCBMb3NzZXMgZm9yIGVhY2ggdG9wIDI1IG1lbidzIHRlYW0iLA0KICAgICAgIGNhcHRpb24gPSAiQmFzZWQgb24gbmV0IHJhbmtpbmcgb2Ygb3Bwb25lbnQgYXMgb2YgRmVicnVhcnkgMTksIDIwMjQiKSArDQogICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gKGNvbG9ycyksIG5hLnZhbHVlID0gImdyZXkiKSArDQogICB0aGVtZShwbG90LnRpdGxlLnBvc2l0aW9uID0gInBsb3QiLA0KICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJTcGFjZSBHcm90ZXNrIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMTIsIG1hcmdpbiA9IG1hcmdpbih0ID0gMTAsIGIgPSAxNSkpLA0KICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJTb3VyY2UgU2FucyAzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gOCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW4gPSBtYXJnaW4oYiA9IDUpKSwNCiAgICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJTb3VyY2UgU2FucyAzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gOCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJTb3VyY2UgU2FucyAzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDgpLA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IE5BLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBOQSksDQogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAwKSkNCg0KaGVhdCA9IGdncGxvdChkZl9yYW5rLCBhZXMoeCA9IGdhbWVfb3JkZXIsIHkgPSB0ZWFtLCBmaWxsID0gcXVhZF9yZXN1bHQsIHRleHQgPSB0b29sdGlwKSkgKw0KICBnZW9tX3RpbGUoKSArDQogIHNjYWxlX2ZpbGxfZGlzY3JldGUobGltaXRzPXJldikgKw0KICB4bGFiKCIiKSArDQogIHlsYWIoIiIpICsNCiAgbGFicyh0aXRsZSA9ICJUb3VybmFtZW50IFJlc3VtZSIsDQogICAgICAgc3VidGl0bGUgPSAiQmVzdCBXaW5zICYgV29yc3QgTG9zc2VzIGZvciBlYWNoIHRvcCAyNSBtZW4ncyB0ZWFtIiwNCiAgICAgICBjYXB0aW9uID0gIkJhc2VkIG9uIG5ldCByYW5raW5nIG9mIG9wcG9uZW50IGFzIG9mIEZlYnJ1YXJ5IDE5LCAyMDI0IikgKw0KICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IChjb2xvcnMpLCBuYS52YWx1ZSA9ICJncmV5IikgKw0KICAgdGhlbWUocGxvdC50aXRsZS5wb3NpdGlvbiA9ICJwbG90IiwNCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiU3BhY2UgR3JvdGVzayIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDEyLCBtYXJnaW4gPSBtYXJnaW4odCA9IDEwLCBiID0gMTUpKSwNCiAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiU291cmNlIFNhbnMgMyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luID0gbWFyZ2luKGIgPSA1KSksDQogICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiU291cmNlIFNhbnMgMyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDgpLA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAidG9wIiwNCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiU291cmNlIFNhbnMgMyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSA4KSwNCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSBOQSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gTkEpLA0KICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gOCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhqdXN0ID0gMCkpDQoNCiNpbnRlcmFjdGl2ZQ0KDQpwbG90bHk6OmdncGxvdGx5KGJ1YmJsZSwgdG9vbHRpcCA9ICJ0b29sdGlwIikNCnBsb3RseTo6Z2dwbG90bHkoaGVhdCwgdG9vbHRpcCA9ICJ0b29sdGlwIikNCg0KYGBgDQojZXhwb3J0DQoNCmBgYHtyfQ0KZ2dzYXZlKHBhc3RlMChwcm9qLCAiL3Zpc3VhbHMvdG9wXzI1LnBuZyIpLCB3aWR0aCA9IDEyMDAsIGhlaWdodCA9IDE1MDAsIHVuaXQgPSAicHgiKQ0KYGBgDQoNCg0KI2RhdGF3cmFwcGVyIGV4cG9ydA0KDQpgYGB7cn0NCnRvcF8yNV9zY2hlZCA9IGRmX3JhbmsgJT4lDQogIG11dGF0ZShxdWFkX3Jlc3VsdCA9IHBhc3RlMChxdWFkLCAiICIsIHJlc3VsdCkpICU+JQ0KICBtdXRhdGUoaGVhdCA9IGNhc2Vfd2hlbihxdWFkX3Jlc3VsdCA9PSAiUTEgVyIgfiAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFkX3Jlc3VsdCA9PSAiUTIgVyIgfiAyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFkX3Jlc3VsdCA9PSAiUTMgVyIgfiAzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFkX3Jlc3VsdCA9PSAiUTQgVyIgfiA0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFkX3Jlc3VsdCA9PSAiUTEgTCIgfiA1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFkX3Jlc3VsdCA9PSAiUTIgTCIgfiA2LA0KICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFkX3Jlc3VsdCA9PSAiUTMgTCIgfiA3LA0KICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFkX3Jlc3VsdCA9PSAiUTQgTCIgfiA4KSkgJT4lDQogIHNlbGVjdCh0ZWFtLCBnYW1lX29yZGVyLCBoZWF0KSAlPiUNCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGdhbWVfb3JkZXIsIHZhbHVlc19mcm9tID0gaGVhdCkgDQoNCg0KYGBgDQoNCmBgYHtyfQ0Kd3JpdGVfY3N2KHRvcF8yNV9zY2hlZCwgcGFzdGUwKHByb2osICIvZGF0YS90b3BfMjUuY3N2IikpDQpgYGANCg0K